package com.wtb.javatool.dao;

import com.wtb.javatool.dto.AssignmentDto;
import com.wtb.javatool.entity.Assignment;
import com.wtb.javatool.dto.StudentGradeDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

@Mapper
public interface AssignmentMapper {
    /**
     * 根据任务id列表查询任务的分配数量
     *
     * @param tasksId 任务id的列表
     * @return 返回数量的列表，依次为分配总数、已完成、进行中、未开始、延期、未批阅.
     */
    AssignmentDto findAssignmentNumberByTasksId(@Param("list") List<Long> tasksId,@Param("evaluationType")Integer evaluationType);

    /**
     * 新增分配记录
     *
     * @param assignment 记录实体
     */
    void addAssignment(Assignment assignment);

    /**
     * 查询普通项目下的某个任务下的所有分配记录
     *
     * @param taskId 任务id
     * @return 返回分配记录列表
     */
    List<AssignmentDto> findNormalAssignmentsByTaskId(Long taskId);

    /**
     * 查询课程项目下的某个任务下的所有分配记录
     *
     * @param taskId 任务id
     * @return 返回分配记录列表
     */
    List<AssignmentDto> findTeachingAssignmentsByTaskId(Long taskId);

    /**
     * 根据分配记录ID列表删除对应分配记录(将状态值改为4）
     *
     * @param assignmentId 分配记录ID
     */
    void deleteAssignmentByAssignmentId(List<Long> assignmentId);


    /**
     * 修改任务分配记录状态
     *
     * @param assignmentsIds     分配记录id列表
     * @param assignmentStatus 任务状态 （0：待领取,1:进行中，2待验收，3已完成）
     */
    void updateAssignmentStatusByAssignmentId(@Param("list") List<Long> assignmentsIds, @Param("assignmentStatus") Integer assignmentStatus);

    /**
     * 更新单个分配记录的截止日期和分配小组
     *
     * @param assignment 分配记录实体 （包含assignmentId,endTime和teamId）
     */
    void updateAssignmentEndTimeAndTeamIdByAssignmentId(Assignment assignment);

    /**
     * 更新多个分配记录的截止日期
     *
     * @param assignmentIdList 分配记录id列表
     * @param endTime          截止日期
     */
    void updateAssignmentsEndTimeByAssignmentIds(@Param("List") List<Long> assignmentIdList, @Param("endTime") Date endTime);


    /**
     * 查询单个分配记录的所有承担人id
     *
     * @param assignmentId 分配记录Id
     */
    List<Long> findAssignmentUndertakerIdsByAssignmentId(Long assignmentId);


    /**
     * 根据任务ID列表,返回在普通项目中列表下任务的所有分配记录 。
     *
     * @param assignmentStatus 分配记录状态
     * @param taskType         任务类型
     * @param courseId         课程ID
     * @param taskIdList       任务ID列表
     * @return 返回记录状态的列表。
     */
    List<AssignmentDto> findNormalTasksAssignments(@Param("List") List<Long> taskIdList,
                                                   @Param("assignmentStatus") Integer assignmentStatus,
                                                   @Param("taskType") Integer taskType,
                                                   @Param("courseId") Long courseId);

    /**
     * 根据任务ID列表,返回在课程项目中列表下任务的所有分配记录 。
     *
     * @param assignmentStatus 分配记录状态
     * @param taskType         任务类型
     * @param courseId         课程ID
     * @param taskIdList       任务ID列表
     * @return 返回记录状态的列表。
     */
    List<AssignmentDto> findTeachingTasksAssignments(@Param("List") List<Long> taskIdList,
                                                     @Param("assignmentStatus") Integer assignmentStatus,
                                                     @Param("taskType") Integer taskType,
                                                     @Param("courseId") Long courseId,
                                                     @Param("evaluationType")Integer evaluationType);

    /**
     * 根据任务ID查询所有的分配记录ID
     *
     * @param taskId 任务ID
     * @return 分配记录ID列表
     */
    List<Long> findAssignmentIdsByTaskId(@Param("taskId") Long taskId);

    /**
     * 根据任务ID删除所有分配记录
     *
     * @param taskId 任务ID
     * @return 影响的行数
     */
    int deleteAssignmentsByTaskId(@Param("taskId") Long taskId);

    /**
     * 查询课程成绩数据
     *
     * @param courseId 课程ID
     * @param classId 班级ID（可选）
     * @param teamId 小组ID（可选）
     * @param studentName 学生姓名或学号（可选）
     * @param studentMajor 学生专业（可选）
     * @param begin 起始位置
     * @param size 每页大小
     * @return 学生成绩列表
     */
    List<StudentGradeDto> findCourseGrades(@Param("courseId") Long courseId,
                                        @Param("classId") Long classId,
                                        @Param("teamId") Long teamId,
                                        @Param("studentName") String studentName,
                                        @Param("studentMajor") String studentMajor,
                                        @Param("begin") Integer begin,
                                        @Param("size") Integer size);

    /**
     * 统计符合条件的学生成绩数量
     *
     * @param courseId 课程ID
     * @param classId 班级ID（可选）
     * @param teamId 小组ID（可选）
     * @param studentName 学生姓名或学号（可选）
     * @param studentMajor 学生专业（可选）
     * @return 符合条件的学生数量
     */
    Integer countCourseGrades(@Param("courseId") Long courseId,
                           @Param("classId") Long classId,
                           @Param("teamId") Long teamId,
                           @Param("studentName") String studentName,
                           @Param("studentMajor") String studentMajor);

}
